home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / games / sokosrc.zoo / score.c < prev    next >
C/C++ Source or Header  |  1991-01-26  |  6KB  |  245 lines

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <string.h>
  4. #include "sokoban.h"
  5. #if ATARIST
  6. #include <tos.h>
  7. #endif
  8.  
  9. extern char *username;
  10. extern short scorelevel, scoremoves, scorepushes;
  11.  
  12. short scoreentries;
  13. struct {
  14.    char user[MAXUSERNAME];
  15.    short lv, mv, ps;
  16. } scoretable[MAXSCOREENTRIES];
  17.  
  18. FILE *scorefile;
  19. #if ATARIST
  20. GFILE sfdbn;
  21. #else
  22. long sfdbn;
  23. #endif
  24.  
  25. short outputscore() {
  26.  
  27.    short ret;
  28.  
  29. #if UNIX
  30.    while( creat( LOCKFILE) < 0);       /* lock the score file */
  31. #endif
  32.  
  33.    if( (ret = readscore()) == 0)
  34.       showscore();
  35. #if UNIX
  36.    unlink( LOCKFILE);
  37. #endif
  38.    return( (ret == 0) ? E_ENDGAME : ret);
  39. }
  40.  
  41.  
  42. short makenewscore() {
  43.  
  44.    short ret = 0;
  45.  
  46.    scoreentries = 0;
  47. #if ATARIST
  48.     if ((sfdbn = Fcreate(SCOREFILE, 0)) < 0) ret = E_FOPENSCORE;
  49.     else {
  50.         Fwrite(sfdbn, 2L, &scoreentries);
  51.         Fclose(sfdbn);
  52.     }
  53. #else
  54.    while( creat( LOCKFILE) < 0);
  55.    if( (scorefile = fopen( SCOREFILE, "w")) == NULL)
  56.       ret = E_FOPENSCORE;
  57.    else {
  58.       sfdbn = fileno( scorefile);
  59.       write( sfdbn, &scoreentries, 2);
  60.       fclose( scorefile);
  61.    }
  62.    unlink( LOCKFILE);
  63. #endif
  64.  
  65.    return( (ret == 0) ? E_ENDGAME : ret);
  66. }
  67.  
  68. short getuserlevel( lv)
  69. short *lv;
  70. {
  71.    short ret = 0, pos;
  72.  
  73. #if UNIX
  74.    while( creat( LOCKFILE) < 0);
  75. #endif
  76.    if( (scorefile = fopen( SCOREFILE, "r")) == NULL)
  77.       ret = E_FOPENSCORE;
  78.    else {
  79.       if( (ret = readscore()) == 0)
  80.         *lv = ( (pos = finduser()) > -1) ? scoretable[pos].lv+1 : 1;
  81.    }
  82. #if UNIX
  83.    unlink( LOCKFILE);
  84. #endif
  85.    return( ret);
  86. }
  87.  
  88. short score() {
  89.  
  90.    short ret;
  91.  
  92. #if UNIX
  93.    while( creat( LOCKFILE) < 0);       /* lock the score file */
  94. #endif
  95.    if( (ret = readscore()) == 0)
  96.       if( (ret = makescore()) == 0)
  97.         if( (ret = writescore()) == 0)
  98.            showscore();
  99. #if UNIX
  100.    unlink( LOCKFILE);
  101. #endif
  102.    return( (ret == 0) ? E_ENDGAME : ret);
  103. }
  104.  
  105. readscore() {
  106.  
  107.    short ret = 0;
  108. #if ATARIST
  109.     int tmp;
  110. #else
  111.    long tmp;
  112. #endif
  113.  
  114.    if( (scorefile = fopen( SCOREFILE, "r")) == NULL)
  115.       ret = E_FOPENSCORE;
  116.    else {
  117.       sfdbn = fileno( scorefile);
  118.       if( read( sfdbn, &scoreentries, 2) != 2) ret = E_READSCORE;
  119.       else {
  120.         tmp = scoreentries * sizeof( scoretable[0]);
  121.         if( read( sfdbn, &(scoretable[0]), tmp) != tmp) ret = E_READSCORE;
  122.       }
  123.       fclose( scorefile);
  124.    }
  125.    return( ret);
  126. }
  127.  
  128. makescore() {
  129.  
  130.    short ret = 0, pos, i, build = 1, insert;
  131.  
  132.    if( (pos = finduser()) > -1) {      /* user already in score file */
  133.       insert =    (scorelevel > scoretable[pos].lv)
  134.               || ( (scorelevel == scoretable[pos].lv) &&
  135.                     (scoremoves < scoretable[pos].mv)
  136.                  )
  137.               || ( (scorelevel == scoretable[pos].lv) &&
  138.                    (scoremoves == scoretable[pos].mv) &&
  139.                    (scorepushes < scoretable[pos].ps)
  140.                  );
  141.       if( insert) {                    /* delete existing entry */
  142.         for( i = pos; i < scoreentries-1; i++)
  143.            cp_entry( i, i+1);
  144.         scoreentries--;
  145.       }
  146.       else build = 0;
  147.    }
  148.    else if( scoreentries == MAXSCOREENTRIES)
  149.       ret = E_TOMUCHSE;
  150.    if( (ret == 0) && build) {
  151.       pos = findpos();                 /* find the new score position */
  152.       if( pos > -1) {                  /* score table not empty */
  153.         for( i = scoreentries; i > pos; i--)
  154.            cp_entry( i, i-1);
  155.       }
  156.       else pos = scoreentries;
  157.  
  158.       strcpy( scoretable[pos].user, username);
  159.       scoretable[pos].lv = scorelevel;
  160.       scoretable[pos].mv = scoremoves;
  161.       scoretable[pos].ps = scorepushes;
  162.       scoreentries++;
  163.    }
  164.    return( ret);
  165. }
  166.  
  167. finduser() {
  168.  
  169.    short i, found;
  170.  
  171.    for( i = 0; (i < scoreentries) && (! found); i++)
  172.       found = (strcmp( scoretable[i].user, username) == 0);
  173.    return( (found) ? i-1 : -1);
  174. }
  175.  
  176. findpos() {
  177.  
  178.    short i, found;
  179.  
  180.    for( i = 0; (i < scoreentries) && (! found); i++)
  181.       found =    (scorelevel > scoretable[i].lv)
  182.              || ( (scorelevel == scoretable[i].lv) &&
  183.                    (scoremoves < scoretable[i].mv)
  184.                 )
  185.              || ( (scorelevel == scoretable[i].lv) &&
  186.                   (scoremoves == scoretable[i].mv) &&
  187.                   (scorepushes < scoretable[i].ps)
  188.                 );
  189.    return( (found) ? i-1 : -1);
  190. }
  191.  
  192. writescore() {
  193.  
  194.    short ret = 0;
  195. #if ATARIST
  196.     int tmp;
  197. #else
  198.    long tmp;
  199. #endif
  200.  
  201.    if( (scorefile = fopen( SCOREFILE, "w")) == NULL)
  202.       ret = E_FOPENSCORE;
  203.    else {
  204.       sfdbn = fileno( scorefile);
  205.       if( write( sfdbn, &scoreentries, 2) != 2) ret = E_WRITESCORE;
  206.       else {
  207.         tmp = scoreentries * sizeof( scoretable[0]);
  208.         if( write( sfdbn, &(scoretable[0]), tmp) != tmp) ret = E_WRITESCORE;
  209.       }
  210.       fclose( scorefile);
  211.    }
  212.    return( ret);
  213. }
  214.  
  215. showscore() {
  216.  
  217.    short lastlv = 0, lastmv, lastps, i;
  218.  
  219.    fprintf( stdout, "Rank        User       Level       Moves      Pushes\n");
  220.    fprintf( stdout, "====================================================\n");
  221.    for( i = 0; i < scoreentries; i++) {
  222.       if( (scoretable[i].lv == lastlv)&&
  223.          (scoretable[i].mv == lastmv) &&
  224.          (scoretable[i].ps == lastps))
  225.         fprintf( stdout, "      ");
  226.       else {
  227.          lastlv = scoretable[i].lv;
  228.          lastmv = scoretable[i].mv;
  229.          lastps = scoretable[i].ps;
  230.          fprintf( stdout, "%4d  ", i+1);
  231.       }
  232.       fprintf( stdout, "%10s  %10d  %10d  %10d\n", scoretable[i].user,
  233.                scoretable[i].lv, scoretable[i].mv, scoretable[i].ps);
  234.    }
  235. }
  236.  
  237. cp_entry( i1, i2)
  238. short i1, i2;
  239. {
  240.    strcpy( scoretable[i1].user, scoretable[i2].user);
  241.    scoretable[i1].lv = scoretable[i2].lv;
  242.    scoretable[i1].mv = scoretable[i2].mv;
  243.    scoretable[i1].ps = scoretable[i2].ps;
  244. }
  245.